home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / Ken Long / SimpleWarp-c / Think & more / StarBurstƒ / StarBurstWarp.c next >
Encoding:
C/C++ Source or Header  |  1994-12-04  |  4.3 KB  |  233 lines  |  [TEXT/KAHL]

  1. #include <math.h>
  2. #include "Warp.h"
  3.  
  4. #define kNumOfStars            70
  5. #define kProjDistance        450
  6. #define kLargeStar            0
  7. #define kSmallStar            1
  8.  
  9. Star        gStarField [kNumOfStars];
  10. int            gVelocity;
  11. Point        gOrigin;
  12. RgnHandle    gOldGrayRgn;
  13. short        gOldMBarHeight;
  14. WindowPtr    gWindow;
  15. RGBColor    starColor;
  16. Rect        starRect;
  17. long int    newLeft, newTop;
  18.  
  19. void main (void)
  20. {
  21.     short    loop;
  22.     OSErr        error;
  23.     SysEnvRec    theWorld;
  24.     
  25.     error = SysEnvirons(1, &theWorld);
  26.     if (theWorld.hasColorQD == false) 
  27.     {
  28.         SysBeep(50);
  29.         ExitToShell();    /* If no color QD, we must leave. */
  30.     }
  31.     
  32.     InitToolbox ();
  33.     InitStarField ();
  34.     HideCursor ();
  35.     
  36.     while (!Button ()) {
  37.         AnimateStarField ();
  38.     }
  39.     
  40.     ShowCursor ();
  41. }
  42.  
  43. void InitToolbox (void)
  44. {
  45.     EventRecord        event;
  46.     short            count;
  47.     Rect            mBarRect;
  48.     RgnHandle        mBarRgn;
  49.     
  50.     InitGraf ((Ptr) &qd.thePort);
  51.     InitFonts ();
  52.     InitWindows ();
  53.     InitMenus ();
  54.     TEInit ();
  55.     InitDialogs (nil);
  56.     InitCursor ();
  57.     
  58.     GetDateTime((unsigned long*) &qd.randSeed);
  59.  
  60.     for (count = 1; count <= 3; ++count)
  61.         EventAvail (everyEvent, &event);
  62.     
  63.     gOldMBarHeight = GetMBarHeight ();
  64.     GetMBarHeight () = 0;
  65.  
  66.     gWindow = NewCWindow (nil, 
  67.                         &screenBits.bounds, 
  68.                          "\p", 
  69.                          true, 
  70.                          plainDBox, 
  71.                         (WindowPtr) -1, 
  72.                          false, 
  73.                          0);
  74.         
  75.     SetRect (&mBarRect, screenBits.bounds.left, screenBits.bounds.top,
  76.         screenBits.bounds.right, screenBits.bounds.top + gOldMBarHeight);
  77.  
  78.     mBarRgn = NewRgn ();
  79.     RectRgn (mBarRgn, &mBarRect);
  80.     UnionRgn (gWindow->visRgn, mBarRgn, gWindow->visRgn);
  81.     DisposeRgn (mBarRgn);
  82.     SetPort (gWindow);
  83.     FillRect (&gWindow->portRect, black);
  84. }
  85.  
  86. void InitStarField (void)
  87. {
  88.     short loop;
  89.     
  90.     starColor.red   = Random();
  91.     starColor.green = Random();
  92.     starColor.blue  = Random();
  93.     
  94.     RGBForeColor (&starColor);
  95.         
  96.     gVelocity = 6;
  97.     gOrigin.h = (screenBits.bounds.right - screenBits.bounds.left) / 2;
  98.     gOrigin.v = (screenBits.bounds.bottom - screenBits.bounds.top) / 2;
  99.     
  100.     for (loop = 0; loop < kNumOfStars; loop++) 
  101.     {
  102.         CreateStar (&gStarField [loop]);    
  103.     }
  104. }
  105.  
  106. void AnimateStarField (void)
  107. {
  108.     short    loop;
  109.     Point    location;
  110.     
  111.     for (loop = 0; loop < kNumOfStars; loop++) 
  112.     {
  113.         location = Project (gStarField [loop]);
  114.         RGBForeColor (&starColor);
  115. //        ForeColor (blackColor);
  116.         if (gStarField [loop].size == kLargeStar)
  117. //            DrawLargeStar (location);
  118. //        else
  119.             DrawSmallStar (location);
  120.         
  121.         AnimateStar (&gStarField [loop]);
  122.         location = Project (gStarField [loop]);
  123.         RGBForeColor (&starColor);
  124.         if (gStarField [loop].size == kLargeStar)
  125. //            DrawLargeStar (location);
  126. //        else
  127.             DrawSmallStar (location);
  128.     }
  129. }
  130.  
  131. void DrawLargeStar (Point aPt)
  132. {
  133.     Rect    starRect;
  134.     
  135.     starRect.left = aPt.h - 1;
  136.     starRect.right = aPt.h + 1;
  137.     starRect.top = aPt.v - 1;
  138.     starRect.bottom = aPt.v + 1;
  139.     
  140.     PaintRect (&starRect);
  141.     
  142.     RGBForeColor (&starColor);
  143. }
  144.  
  145. void DrawSmallStar (Point aPt)
  146. {
  147.     MoveTo (aPt.h, aPt.v);
  148.     LineTo (aPt.h, aPt.v);
  149.  
  150.     RGBForeColor (&starColor);
  151. }
  152.  
  153. Point Project (Star aStar)
  154. {
  155.     Point    starRect;
  156.     
  157.     starRect.h = aStar.x * kProjDistance / aStar.z + gOrigin.h;
  158.     starRect.v = aStar.y * kProjDistance / aStar.z + gOrigin.v;
  159.     
  160.     return starRect;
  161. }
  162.  
  163. void AnimateStar (Star *aStar)
  164. {
  165.     aStar->z = aStar->z - gVelocity;
  166.     if (aStar->z <= 0)
  167.         CreateStar (aStar);
  168.     
  169.     /* aStar->x = aStar->x - 0;
  170.     if (aStar->x <= 0)
  171.         CreateStar (aStar);
  172.     
  173.     aStar->y = aStar->y - 0;
  174.     if (aStar->y <= 0)
  175.         CreateStar (aStar); */
  176. }
  177.  
  178. void CreateStar (Star *aStar)
  179. {
  180.     aStar->x = GetRandom (0, gOrigin.h);
  181.     
  182.     if (GetRandom (0,1) == 0)
  183.         aStar->x = -aStar->x;
  184.         
  185.     aStar->y = GetRandom (0, gOrigin.v);
  186.     
  187.     if (GetRandom (0,1) == 0)
  188.         aStar->y = -aStar->y;
  189.         
  190.     aStar->z = GetRandom (0, 150) + 125;
  191.     aStar->size = GetRandom (0,1);
  192. }
  193.  
  194. unsigned short GetRandom(unsigned short min, unsigned short max)
  195. {
  196.     unsigned short random;
  197.     long range, starRect;
  198.  
  199.     random = Random();
  200.     range = (max - min) + 1;
  201.     starRect = (random * range) / 65536;
  202.     random = starRect + min;
  203.  
  204.     return random;
  205. }
  206. /*
  207. void NewBall()
  208. {
  209.     RGBColor    starColor;
  210.     Rect        starRect;
  211.     long int    newLeft, newTop;
  212.         
  213.     starColor.red   = Random();
  214.     starColor.green = Random();
  215.     starColor.blue  = Random();
  216.     
  217.     RGBForeColor (&starColor);
  218.     
  219.     newTop = Random();    newLeft = Random();
  220.     newTop = ((newTop+32767) * windRect.bottom)/65536;
  221.     newLeft = ((newLeft+32767) * windRect.right)/65536;
  222.     
  223.     SetRect(&starRect, 
  224.              newLeft, 
  225.              newTop, 
  226.              newLeft + BallWidth, 
  227.              newTop + BallHeight);
  228.         
  229.     MoveTo(newLeft, newTop);
  230.     PaintOval (&starRect);
  231.     RGBForeColor(&starColor);
  232. }
  233. */